/**
 创建JS对象两种方式,对象字面量和使用new表达式,new表达式是配合构造函数使用的.
 那么，在使用new操作符来调用一个构造函数的时候，发生了什么呢？就发生了四件事：

 //构造函数
 function Fun(){}
 let fun = new Fun()

 // 当执行new Fun()发生下面四件事情：
 //第一，创建一个空对象obj。
 let obj  ={}

 //第二，将这个空对象的proto成员指向了构造函数对象的prototype成员对象，这是最关键的一步
 obj.__proto__ = Fun.prototype

 //第三，让Fun的this指向obj，并执行fn的函数体
 Fun.call(obj,...)

 // 第四，判断Fun的返回值类型，如果是值类型，返回obj。如果是引用类型，就返回这个引用类型的对象。
 return obj


 注意：箭头函数不可以new
 */

// 构造函数return 非引用数据类型的时候
// 在JavaScript构造函数中：如果return值类型，那么对构造函数没有影响，实例化对象返回空对象；
function Foo(value){
    this.value = value
    return value+value
}
const foo = new Foo('A')
console.log('foo:',foo) // Foo { value: 'A' }
console.log("foo.value",foo.value) // A


// 构造函数return 引用数据类型的时候
// 如果return引用类型（数组，函数，对象），那么实例化对象就会返回该引用类型；
function Bar(value){
    this.value = value
    return {
        value:value+value
    }
}
const bar = new Bar('A')
console.log('bar:',bar) // { value: 'AA' }
console.log('bar.value:',bar.value) // AA




